package errno

import (
	"encoding/json"

	"go-gin-api/pkg/errors"
)

var _ Error = (*err)(nil)

type Error interface {
	// i 为了避免被其他包实现
	i()
	// WithErr 设置错误信息
	WithErr(err error) Error

	// GetCode 获取 HTTP Code
	GetCode() int
	// GetMsg 获取 Msg
	GetMsg() string
	// GetErr 获取错误信息
	GetErr() error
	// ToString 返回 JSON 格式的错误详情
	ToString() string
}

type err struct {
	Code    int    // HTTP Code
	Message string // 描述信息
	Err     error  // 错误信息
}

func NewError(code int, msg string) Error {
	return &err{
		Code:    code,
		Message: msg,
	}
}

func (e *err) i() {}

func (e *err) WithErr(err error) Error {
	e.Err = errors.WithStack(err)
	return e
}

func (e *err) GetCode() int {
	return e.Code
}

func (e *err) GetMsg() string {
	return e.Message
}

func (e *err) GetErr() error {
	return e.Err
}

// ToString 返回 JSON 格式的错误详情
func (e *err) ToString() string {
	err := &struct {
		Code    int    `json:"code"`
		Message string `json:"message"`
	}{
		Code:    e.Code,
		Message: e.Message,
	}

	raw, _ := json.Marshal(err)
	return string(raw)
}
